package dao;

import java.io.File;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import models.Usuario;

import org.apache.commons.io.FileUtils;

public class DAOUsuario implements DAO<Usuario> {

	@Override
	public Integer inserir(Usuario f) {
		try {
			// Comando SQL que vai ser enviado ao banco
			String insert = "insert into usuario(Login, Nome, Sexo, Datanascimento, Email, Senha, Refoto, Sobremim, Pais, Contadoruser) values(? ,?, ?, ?, ?, ?, ?, ?, ?, ?)";
			// Objeto que executa o comando SQL
			PreparedStatement statement = DAOConnection.getConnection()
					.prepareStatement(insert);
			// Seta parâmetros do comando SQL
			statement.setString(1, f.login);
			statement.setString(2, f.nome);
			statement.setString(3, f.sexo);
			statement.setString(4, f.datanascimento);
			statement.setString(5, f.email);
			statement.setString(6, f.senha);
			statement.setString(8, f.sobremim);
			statement.setString(9, f.pais);

			String template = "C:\\Users\\Bonei\\Filmania\\public\\Usuarios"
					+ File.separatorChar + "%s.img";
			String refoto = null;
			while (true) {
				refoto = String.format(template, f.contadoruser);
				if (new File(refoto).exists())
					f.contadoruser++;
				else
					break;
			}

			File localFoto = new File(refoto);
			try {
				FileUtils.copyFile(f.foto, localFoto);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			f.refoto = refoto;
			statement.setString(7, f.refoto);
			statement.setInt(10, f.contadoruser);
			// Executa insert no banco de dados
			return statement.executeUpdate();
		} catch (SQLException e) {
			System.out.print(e.getMessage());
		} finally {
			DAOConnection.closeConnection();
		}
		return 0;
	}

	@Override
	public int atualizar(Usuario f) {
		try {
			// Comando SQL que vai ser enviado ao banco
			String update = "update usuario set Nome = ?, Sexo = ?, Datanascimento = ?, Email = ?, Senha = ?, Refoto = ?, Sobremim = ?, Pais = ? where login = ?";
			// Objeto que executa o comando SQL
			PreparedStatement statement = DAOConnection.getConnection()
					.prepareStatement(update);
			// Seta parâmetros do comando SQL
			statement.setString(9, f.login);
			statement.setString(1, f.nome);
			statement.setString(2, f.sexo);
			statement.setString(3, f.datanascimento);
			statement.setString(4, f.email);
			statement.setString(5, f.senha);
			statement.setString(7, f.sobremim);
			statement.setString(8, f.pais);

			File filedel = new File(f.refoto);
			filedel.delete();

			String template = "C:\\Users\\Bonei\\Filmania\\public\\Usuarios"
					+ File.separatorChar + "%s.img";
			String refoto = null;
			refoto = String.format(template, f.contadoruser);

			File localFoto = new File(refoto);
			try {
				FileUtils.copyFile(f.foto, localFoto);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			f.refoto = refoto;
			statement.setString(6, f.refoto);

			// Executa update no banco de dados
			return statement.executeUpdate();
		} catch (SQLException e) {
			System.out.print(e.getMessage());
		} finally {
			DAOConnection.closeConnection();
		}
		return 0;
	}

	@Override
	public int excluir(Usuario f) {
		try {
			// Comando SQL que vai ser enviado ao banco
			String delete = "delete from usuario where login = ?";
			// Objeto que executa o comando SQL
			PreparedStatement statement = DAOConnection.getConnection()
					.prepareStatement(delete);
			// Seta parâmetros do comando SQL
			statement.setString(1, f.login);
			// Executa update no banco de dados
			return statement.executeUpdate();
		} catch (SQLException e) {

			System.out.print(e.getMessage());
		} finally {
			DAOConnection.closeConnection();
		}
		return 0;
	}

	@Override
	public List<Usuario> todos() {
		List<Usuario> objs = new ArrayList<Usuario>();
		SimpleDateFormat dt = new SimpleDateFormat("dd/MM/yyyy");
		try {
			// Comando SQL que vai ser enviado ao banco
			String query = "select Login, Nome, Sexo, Datanascimento, Email, Senha, Refoto, Sobremim, Pais, contadoruser from usuario";
			// Objeto que executa o comando SQL
			Statement statement = DAOConnection.getConnection()
					.createStatement();
			// Execução do comando SQL e retorno como ResultSet
			ResultSet resultSet = statement.executeQuery(query);
			// Iteração no ResultSet
			while (resultSet.next()) {
				Usuario obj = new Usuario();
				obj.login = resultSet.getString(1);
				obj.nome = resultSet.getString(2);
				obj.sexo = resultSet.getString(3);
				obj.datanascimento = dt.format(resultSet.getDate(4));
				obj.email = resultSet.getString(5);
				obj.senha = resultSet.getString(6);
				obj.refoto = resultSet.getString(7);
				obj.sobremim = resultSet.getString(8);
				obj.pais = resultSet.getString(9);
				obj.contadoruser = resultSet.getInt(10);
				obj.foto = new File(obj.refoto);
				objs.add(obj);
			}
		} catch (SQLException e) {
			System.out.print(e.getMessage());
		} finally {
			DAOConnection.closeConnection();
		}
		return objs;
	}
}